/**
 * 
 */
package br.coppe.coimbra.processing.text;

import silabas.SilabasPT;

/**
 * Str é uma classe auxiliar para
 * o processamento de Strings.
 * 
 * Para ver o processo de separação das sílabas, veja:
 * {@link <a href="http://linguateca.dei.uc.pt/index.php?sep=recursos">liguateca</a>}
 * 
 * 
 * @author phillipe
 * 
 */
public abstract class Str {

	private Str(){}

	/**
	 * 
	 * @param text uma string de palavra ou texto.
	 * @return a quantidade de letras de uma palavra ou texto.
	 */
	public static int lettersNumber(String text) {

		return text.replaceAll("\\W|\\d|\\s|\\p{InGreek}", "").length();
	}

	/**
	 * 
	 * @param text uma string de palavra ou texto.
	 * @return a string sem espaços extras.
	 */
	public static String cleanExtraSpaces(String text) {
		
		text  = text.replaceAll("\\s{2,}", " ").trim();
		text = text.replaceAll("\\s\\p{Punct}+]",".");
		return text;
	}

	/**
	 * 
	 * @param text uma string de palavra ou texto.
	 * @return a string sem espaços extras e sem pontuação.
	 */
	public static String cleanPunctuation(String text) {

		text = cleanExtraSpaces(text);

		return text.replaceAll("\\p{Punct}", "");
	}

	/**
	 * 
	 * @param text uma string.
	 * @return a quantidade de palavras do texto.
	 */
	public static int wordsNumber(String text) {

		return words(text).length;
	}

	/**
	 * 
	 * @param text uma string de texto.
	 * @return as palavras do texto
	 */
	public static String[] words(String text) {

		text = cleanPunctuation(text);

		return text.split(" ");
	}
	/**
	 * 
	 * @param text uma string de texto.
	 * @return um conjunto de sentenças do texto.
	 */
	public static String[] sentences(String text) {

		text = cleanExtraSpaces(text);
		text = text.replaceAll("[\\p{Punct}&&[^!?.]]", "");

		String[] sentence = text.split("[!?.]");

		int sentencesLen = sentence.length;
		for (int i = 0; i < sentencesLen; ++i)
			sentence[i] = cleanPunctuation(sentence[i]);

		return sentence;


	}

	/**
	 * 
	 * @param text uma string.
	 * @return a quantidade de sentenças do texto.
	 */
	public static int sentencesNumber(String text) {

		return sentences(text).length;
	}

	/**
	 * 
	 * @param text uma string.
	 * @return a média de palavras por sentença do texto.
	 */
	public static float averageWordsPerSentence(String text) {

		float average = wordsNumber(text) / (float) sentencesNumber(text);

		return average;
	}

	/**
	 * 
	 * @param word uma string palavra
	 * @return a quantidade de sílabas desta palavra
	 */
	public static int syllablesNumber(String word)  {

		return SilabasPT.separa(word).size(); 

	}

	/**
	 * 
	 * @param text uma string texto
	 * @return a média de sílabas por palavra
	 */
	public static float averageSyllablesPerWord(String text) {

		long syllablesTotal = 0;
		String[] words = words(text);
		for (String w: words)
			syllablesTotal += syllablesNumber(w);

				return syllablesTotal / (float) wordsNumber(text);
	}

	/**
	 * 
	 * @param text uma string texto
	 * @return palavras com 3 ou mais sílabas
	 */
	public static int wordsWith3Syllables(String text) {

		int words3 = 0;
		String[] words = words(text);

		for (String w : words) 
			if (syllablesNumber(w) > 2)
				words3++;
				return words3;
	}
	/**
	 * 
	 * @param text uma string texto.
	 * @return porcentagem de palavras com 3 ou mais sílabas
	 */
	public static float percentageWordsWith3Syllables(String text) {

		return wordsWith3Syllables(text)/(float) wordsNumber(text);
	}
}
